package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import Helper.Util;
import Model.Cidade;
import Model.Entidade;
import Model.Estado;

public class EntidadeDAO implements ItfBanco<Entidade> {

	@Override
	public void inserir(Entidade entidade) throws SQLException {
		Connection con = Conexao.getConexao();
		String sql = "INSERT INTO ENTIDADE VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		//DECLARE @id INT SET @id = SCOPE_IDENTITY()
		try(PreparedStatement pstm = con.prepareStatement(sql)) {
			
			pstm.setString(1, entidade.getRazaoSocial());
			pstm.setString(2, entidade.getCnpj());
			pstm.setString(3, entidade.getLogradouro());
			pstm.setString(4, entidade.getNumero());
			pstm.setString(5, entidade.getBairro());
			pstm.setString(6, entidade.getCep());
			pstm.setInt(7, entidade.getStatus());
			pstm.setInt(8, entidade.getCidade().getId());
			pstm.setInt(9, entidade.getEstado().getId());
			
			pstm.execute();
			
		} catch (Exception e) {
			System.out.println("Erro ao inserir entidade: ");
			e.printStackTrace();
		}
		
		con.close();
	}

	@Override
	public void atualizar(Entidade entidade) throws SQLException {
		Connection con = Conexao.getConexao();
		String sql = "UPDATE ENTIDADE SET"
				+ "         RAZAO_SOCIAL = ?,"
				+ "         CNPJ = ?,"
				+ "         LOGRADOURO = ?,"
				+ "         NUMERO = ?,"
				+ "         BAIRRO = ?,"
				+ "         CEP = ?,"
				+ "         STATUS_ENTIDADE = ?,"
				+ "         CIDADE = ?"
				+ "   WHERE ID_ENTIDADE = ?";
		
		try(PreparedStatement pstm = con.prepareStatement(sql)) {
			
			pstm.setString(1, entidade.getRazaoSocial());
			pstm.setString(2, entidade.getCnpj());
			pstm.setString(3, entidade.getLogradouro());
			pstm.setString(4, entidade.getNumero());
			pstm.setString(5, entidade.getBairro());
			pstm.setString(6, entidade.getCep());
			pstm.setInt(7, entidade.getStatus());
			pstm.setInt(8, entidade.getCidade().getId());
			pstm.setInt(9, entidade.getId());
			
			pstm.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("Erro ao atualizar entidade: ");
			e.printStackTrace();
		}
		
		con.close();
	}

	@Override
	public Entidade listar(Entidade entidade) throws SQLException {
		Connection con = Conexao.getConexao();
		
		String sql = "SELECT ENT.ID_ENTIDADE,"
				+ "			 ENT.RAZAO_SOCIAL,"
				+ "			 ENT.CNPJ,"
				+ "			 ENT.LOGRADOURO,"
				+ "			 ENT.NUMERO,"
				+ "			 ENT.BAIRRO,"
				+ "			 ENT.CEP,"
				+ "			 ENT.STATUS_ENTIDADE,"
				+ "			 ENT.CIDADE,"
				+ "			 CID.NOME_CIDADE,"
				+ "			 CID.ID_ESTADO,"
				+ "			 EST.SIGLA_ESTADO,"
				+ "			 EST.NOME_ESTADO"
				+ "	FROM ENTIDADE ENT"
				+ " INNER JOIN CIDADE_TRM CID "
				+ "		  ON ENT.CIDADE = CID.ID_CIDADE"
				+ " INNER JOIN ESTADO_TRM EST "
				+ "		  ON CID.ID_ESTADO = EST.ID_ESTADO"
				+ " WHERE ID_ENTIDADE = ? ";
			
		ResultSet rs;
		
		//DECLARE @id INT SET @id = SCOPE_IDENTITY()
		try(PreparedStatement pstm = con.prepareStatement(sql)) {
			
			pstm.setInt(1, entidade.getId());
			
			rs = pstm.executeQuery();
			
			while(rs.next()){
				Estado est = new Estado();
				est.setId(rs.getInt("ID_ESTADO"));
				
				EstadoDAO eDAO = new EstadoDAO();
				Estado estado = eDAO.listar(est);
				
				Cidade cidade = new Cidade();
				cidade.setId(rs.getInt("CIDADE"));
				cidade.setNomeCidade(rs.getString("NOME_CIDADE"));
				
				entidade.setId(rs.getInt("ID_ENTIDADE"));
				entidade.setRazaoSocial(rs.getString("RAZAO_SOCIAL"));
				entidade.setCnpj(rs.getString("CNPJ"));
				entidade.setLogradouro(rs.getString("LOGRADOURO"));
				entidade.setNumero(rs.getString("NUMERO"));
				entidade.setBairro(rs.getString("BAIRRO"));
				entidade.setCep(rs.getString("CEP"));
				entidade.setStatus(rs.getInt("STATUS_ENTIDADE"));
				entidade.setEstado(estado);
				entidade.setCidade(cidade);
			}
			
		} catch (Exception e) {
			System.out.println("Erro ao listar Entidade: ");
			e.printStackTrace();
		}	
		
		con.close();
		return entidade;
	}

	@Override
	public ArrayList<Entidade> listarTodos() throws SQLException {
		ArrayList<Entidade> lista = new ArrayList<>();
		
		Connection con = Conexao.getConexao();
		String sql = "SELECT ENT.ID_ENTIDADE,"
				+ "			 ENT.RAZAO_SOCIAL,"
				+ "			 ENT.CNPJ,"
				+ "			 ENT.LOGRADOURO,"
				+ "			 ENT.NUMERO,"
				+ "			 ENT.BAIRRO,"
				+ "			 ENT.CEP,"
				+ "			 ENT.STATUS_ENTIDADE,"
				+ "			 ENT.CIDADE,"
				+ "			 CID.NOME_CIDADE,"
				+ "			 CID.ID_ESTADO,"
				+ "			 EST.SIGLA_ESTADO,"
				+ "			 EST.NOME_ESTADO"
				+ "	FROM ENTIDADE ENT"
				+ " INNER JOIN CIDADE_TRM CID "
				+ "		  ON ENT.CIDADE = CID.ID_CIDADE"
				+ " INNER JOIN ESTADO_TRM EST "
				+ "		  ON CID.ID_ESTADO = EST.ID_ESTADO"
				+ " WHERE STATUS_ENTIDADE <> ?";
		
		ResultSet rs;
		PreparedStatement pstm = con.prepareStatement(sql);
		pstm.setInt(1, Util.stExcluido);
		rs = pstm.executeQuery();
		
		while (rs.next()){
			Entidade entidade = new Entidade();
			entidade.setId(rs.getInt("ID_ENTIDADE"));
			entidade.setRazaoSocial(rs.getString("RAZAO_SOCIAL"));
			entidade.setCnpj(rs.getString("CNPJ"));
			entidade.setLogradouro(rs.getString("LOGRADOURO"));
			entidade.setNumero(rs.getString("NUMERO"));
			entidade.setBairro(rs.getString("BAIRRO"));
			entidade.setCep(rs.getString("CEP"));
			entidade.setStatus(rs.getInt("STATUS_ENTIDADE"));
			Estado estado = new Estado();
				estado.setId(rs.getInt("ID_ESTADO"));
				estado.setSiglaEstado(rs.getString("SIGLA_ESTADO"));
				estado.setNomeEstado(rs.getString("NOME_ESTADO"));
			entidade.setEstado(estado);
			Cidade cidade = new Cidade();
				cidade.setId(rs.getInt("CIDADE"));
				cidade.setNomeCidade(rs.getString("NOME_CIDADE"));
			entidade.setCidade(cidade);
			lista.add(entidade);
		}
		
		con.close();
		return lista;
	}
}
